﻿using Common;
using gregn6Lib;
using NursingFormSystem.Common;
using NursingFormSystem.Model;
using SQLDLL;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NursingFormSystem.TubeDrawing
{
    public partial class ExtubationRisPrint : Form
    {
        #region 变量声明
        private GridppReport Report = new GridppReport();
        public NurFormsService.NursingForm formService = new NurFormsService.NursingForm();
        PatientInfo PatientInfo;
        DateTime Start;
        DateTime End;
        Tb_User LoginUser;
        ElectronicSignature es;
        #endregion

        #region 构造函数
        public ExtubationRisPrint(Tb_User loginUser, PatientInfo patientInfo, DateTime StartDate, DateTime EndDate)
        {
            InitializeComponent();
            PatientInfo = patientInfo;
            LoginUser = loginUser;
            Start = StartDate;
            End = EndDate;
            es = new ElectronicSignature(this.LoginUser);
            //载入报表模板数据
            Report.LoadFromFile(System.Windows.Forms.Application.StartupPath + @"\GRFModel\Ydhl_GRF\住院患者非计划性拔管风险评估护理单.grf");
            //设置与数据源的连接串，因为在设计时指定的数据库路径是绝对路径。
            Report.ConnectionString = Utility.GetDatabaseConnectionString();
            //连接报表取数事件
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
            //设定查询显示器关联的报表
            axGRPrintViewer1.Report = Report;
        }
        #endregion

        #region 连接报表取数事件
        private void ReportFetchRecord()
        {
            var ret = formService.GetNursingFormRecordByDate(PatientInfo.PATIENT_ID, PatientInfo.VISIT_ID, (int)FormType.Extubation, Start, End);
            DataTable dt = new DataTable();
            if (ret.Code == 1)
            {
                CreateDataTableHead(dt);
                List<NursingFormRecord> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<NursingFormRecord>>(ret.D);
                if (list == null || list.Count <= 0) return;
                //日期降序
                list = list.OrderByDescending(p => p.AssessmentDate).ToList();
                //取得最新的xml对象 而且 所有导管已拔除 时间 带管转科 时间 带管出院 时间 预防效果 有值和已勾选
                Extubation new_ps = XmlUtil.XMLToObject<Extubation>(list[0].NursingFormData, Encoding.UTF8);
                //取7项有一项非空的 取到非空的马上停止
                foreach (var item in list)
                {
                    NursingFormRecord rd = item;
                    Extubation ps = XmlUtil.XMLToObject<Extubation>(rd.NursingFormData, Encoding.UTF8);
                    new_ps = ps;
                    if (!string.IsNullOrEmpty(new_ps.SuoYouDaoGuanYiBaChu) && new_ps.SuoYouDaoGuanYiBaChu.Equals("1")) break;
                    if (!string.IsNullOrEmpty(new_ps.SuoYouDaoGuanYiBaChuShiJian)) break;
                    if (!string.IsNullOrEmpty(new_ps.DaiGuanZhuanKe) && new_ps.DaiGuanZhuanKe.Equals("1")) break;
                    if (!string.IsNullOrEmpty(new_ps.DaiGuanZhuanKeShiJian)) break;
                    if (!string.IsNullOrEmpty(new_ps.DaiGuanChuYuan) && new_ps.DaiGuanChuYuan.Equals("1")) break;
                    if (!string.IsNullOrEmpty(new_ps.DaiGuanChuYuanShiJian)) break;
                    if (!string.IsNullOrEmpty(new_ps.YuFangXiaoGuo) && (new_ps.YuFangXiaoGuo.Equals("0") || new_ps.YuFangXiaoGuo.Equals("1"))) break;
                }

                for (int i = 0; i < list.Count; i++)
                {
                    NursingFormRecord rd = list[i];
                    Extubation ps = XmlUtil.XMLToObject<Extubation>(rd.NursingFormData, Encoding.UTF8);
                    string image1 = "";
                    string RYHS = ps.ZheRenHuShiQianMing;
                    if (!string.IsNullOrEmpty(RYHS))
                    {
                        image1 = es.GetElectricSignBase64(rd.AreaId, ps.ZheRenHuShiQianMing);
                    }

                    if (!string.IsNullOrEmpty(ps.GuanDaoGuDingFangShi))
                    {
                        switch (ps.GuanDaoGuDingFangShi)
                        {
                            case "0":
                                ps.GuanDaoGuDingFangShi = "1#0#0";
                                break;
                            case "1":
                                ps.GuanDaoGuDingFangShi = "0#1#0";
                                break;
                            case "2":
                                ps.GuanDaoGuDingFangShi = "0#0#1";
                                break;
                            default:
                                break;
                        }
                    }
                    else
                    {
                        ps.GuanDaoGuDingFangShi = "0#0#0";
                    }


                    dt.Rows.Add(
                                PatientInfo.IN_DEPARTMENT_DATE,//IN_DEPARTMENT_DATE
                                PatientInfo.IN_DATE,//IN_DATE
                                PatientInfo.PATIENT_NAME,
                                PatientInfo.SEX,//SEX
                                PatientInfo.AGE,//AGE
                                PatientInfo.NURSE_CELL_NAME,//NURSE_CELL_NAME,
                                PatientInfo.DEPARTMENT_NAME,//DEPARTMENT_NAME,
                                PatientInfo.BED_NO,//BED_NO,
                                PatientInfo.PATIENT_ID,//PATIENTID
                                PatientInfo.DIAGNOSE,//DIAGNOSE
                                ps.PingGuRiQi,
                        //基本信息11个通过
                                ps.NianLin == "0" ? "2" : "",//年龄：≤7岁
                                ps.NianLin == "1" ? "2" : "",//年龄：≥70岁
                                ps.YiShi == "0" ? "3" : "",//意识：模糊
                                ps.YiShi == "1" ? "2" : "",//意识：嗜睡
                                ps.YiShi == "2" ? "1" : "",//意识：昏迷
                        //年龄意识通过
                                ps.NaiShouChengDu == "0" ? "3" : "",//耐受程度
                                ps.NaiShouChengDu == "1" ? "2" : "",//耐受程度
                                ps.NaiShouChengDu == "2" ? "1" : "",//耐受程度
                                ps.HuoDong == "0" ? "2" : "",//活动：术后3天内
                                ps.HuoDong == "1" ? "1" : "",//活动：行动不稳
                        //耐受程度活动通过

                                ps.HeCuoChengDu == "0" ? "3" : "",//合作程度
                                ps.HeCuoChengDu == "1" ? "2" : "",//合作程度
                                ps.HeCuoChengDu == "2" ? "1" : "",//合作程度
                                ps.GuanDaoGuDingFangShi.Split('#')[0].Equals("1") ? "3" : "",//管道固定方式
                                ps.GuanDaoGuDingFangShi.Split('#')[1].Equals("1") ? "2" : "",//管道固定方式
                                ps.GuanDaoGuDingFangShi.Split('#')[2].Equals("1") ? "1" : "",//管道固定方式
                        //合作程度 管道固定方式通过

                                getScore(ps.GDZL_GaoWei_Text, 3),//管道种类：高危
                                getScore(ps.GDZL_ZhongWei_Text, 2), //管道种类：中危
                                getScore(ps.GDZL_DiWei_Text, 1),//管道种类：低危
                        //管道种类 3个通过

                                ps.ZongFen,//总分
                                ps.HuLiCuoShi.Substring(0, 1) == "1" ? "√" : "",//护理措施：1.评估患者意识及合作程度，确定是否存在滑脱危险。
                                ps.HuLiCuoShi.Substring(2, 1) == "1" ? "√" : "",//护理措施：2.管道插入深度适宜，做好标识，妥善固定。
                                ps.HuLiCuoShi.Substring(4, 1) == "1" ? "√" : "",//护理措施：3.做好宣教，告知留置管道的目的、注意事项等，取得配合。
                                ps.HuLiCuoShi.Substring(6, 1) == "1" ? "√" : "",//护理措施：4.给予约束，必要时根据医嘱给予镇静药。
                                ps.HuLiCuoShi.Substring(8, 1) == "1" ? "√" : "",//护理措施：5.实施治疗时，先妥善固定好导管。
                                ps.HuLiCuoShi.Substring(10, 1) == "1" ? "√" : "",//护理措施：6.对外出或下床患者，应检查导管是否衔接牢固，避免牵拉。
                                ps.HuLiCuoShi.Substring(12, 1) == "1" ? "√" : "",//护理措施：7.及时巡视病房，做好观察记录。
                                ps.HuLiCuoShi.Substring(14, 1) == "1" ? "√" : "",//护理措施：8.告知家属加强陪伴。
                                ps.HuLiCuoShi.Substring(16, 1) == "1" ? "√" : "",//护理措施：9.其他。
                                !Base.ESSwitch.Equals("on") ? ps.ZheRenHuShiQianMing : "",//责任护士签字
                        //总分 护理措施 责任护士通过

                                ps.ZongFen,//总分                                
                                new_ps.SuoYouDaoGuanYiBaChu,//底部数据 取最新数据
                                new_ps.SuoYouDaoGuanYiBaChuShiJian,
                                new_ps.DaiGuanZhuanKe,
                                new_ps.DaiGuanZhuanKeShiJian,
                                new_ps.DaiGuanChuYuan,
                                new_ps.DaiGuanChuYuanShiJian,
                                new_ps.YuFangXiaoGuo,
                                image1);//无非计划拔管,非计划性拔管
                }

                //将 DataTable 的数据转储到 Grid++Report 的数据集中
                Utility.FillRecordToReport(Report, dt);
            }
            else if (ret.Code == 2)
            {
                CreateDataTableHead(dt);
                DataRow dr = dt.NewRow();
                dt.Rows.Add(dr);
                Utility.FillRecordToReport(Report, dt);
            }
            else if (ret.Code == 0)
            {
                MessageBox.Show(ret.M);
            }
        }

        /// <summary>
        /// 创建列头
        /// </summary>
        /// <param name="dt"></param>
        private static void CreateDataTableHead(DataTable dt)
        {
            dt.Columns.Add("IN_DEPARTMENT_DATE", typeof(string));
            dt.Columns.Add("IN_DATE", typeof(string));
            dt.Columns.Add("PatientName", typeof(string));
            dt.Columns.Add("SEX", typeof(string));
            dt.Columns.Add("AGE", typeof(string));
            dt.Columns.Add("NURSE_CELL_NAME", typeof(string));
            dt.Columns.Add("DEPARTMENT_NAME", typeof(string));
            dt.Columns.Add("BED_NO", typeof(string));
            dt.Columns.Add("PatientId", typeof(string));
            dt.Columns.Add("DIAGNOSE", typeof(string));
            dt.Columns.Add("PingGuRiQi", typeof(DateTime));//评估日期
            //基本信息11个通过
            dt.Columns.Add("nianling1", typeof(string));//年龄：≤7岁
            dt.Columns.Add("nianling2", typeof(string));//年龄：≥70岁
            dt.Columns.Add("yishi1", typeof(string));//意识：模糊
            dt.Columns.Add("yishi2", typeof(string));//意识：嗜睡
            dt.Columns.Add("yishi3", typeof(string));//意识：昏迷
            //年龄意识通过
            dt.Columns.Add("naishouchengdu1", typeof(string));//耐受程度1
            dt.Columns.Add("naishouchengdu2", typeof(string));//耐受程度2
            dt.Columns.Add("naishouchengdu3", typeof(string));//耐受程度3
            dt.Columns.Add("huodong1", typeof(string));//活动：术后3天内
            dt.Columns.Add("huodong2", typeof(string));//活动：行动不稳
            //耐受程度活动通过

            dt.Columns.Add("hezuochengdu1", typeof(string));
            dt.Columns.Add("hezuochengdu2", typeof(string));
            dt.Columns.Add("hezuochengdu3", typeof(string));
            dt.Columns.Add("guandaogudingfangshi1", typeof(string));
            dt.Columns.Add("guandaogudingfangshi2", typeof(string));
            dt.Columns.Add("guandaogudingfangshi3", typeof(string));
            //合作程度 管道固定方式通过

            dt.Columns.Add("gdzlgw", typeof(string));//管道种类：高危
            dt.Columns.Add("gdzlzw", typeof(string));//管道种类：中危
            dt.Columns.Add("gdzldw", typeof(string));//管道种类：低危
            //管道种类 3个通过

            dt.Columns.Add("zongfen", typeof(string));//总分
            dt.Columns.Add("hulicuoshi_pg", typeof(string));//护理措施：1.评估患者意识及合作程度，确定是否存在滑脱危险。
            dt.Columns.Add("hulicuoshi_gd", typeof(string));//护理措施：2.管道插入深度适宜，做好标识，妥善固定。
            dt.Columns.Add("hulicuoshi_zh", typeof(string));//护理措施：3.做好宣教，告知留置管道的目的、注意事项等，取得配合。
            dt.Columns.Add("hulicuoshi_jy", typeof(string));//护理措施：4.给予约束，必要时根据医嘱给予镇静药。
            dt.Columns.Add("hulicuoshi_ss", typeof(string));//护理措施：5.实施治疗时，先妥善固定好导管。
            dt.Columns.Add("hulicuoshi_dw", typeof(string));//护理措施：6.对外出或下床患者，应检查导管是否衔接牢固，避免牵拉。
            dt.Columns.Add("hulicuoshi_js", typeof(string));//护理措施：7.及时巡视病房，做好观察记录。
            dt.Columns.Add("hulicuoshi_gz", typeof(string));//护理措施：8.告知家属加强陪伴。
            dt.Columns.Add("hulicuoshi_qita", typeof(string));//护理措施：9.其他。
            dt.Columns.Add("zenrenhushiqianzi", typeof(string));//责任护士签字
            //总分 护理措施 责任护士 通过

            dt.Columns.Add("sum", typeof(string));//总分            
            dt.Columns.Add("suoyoudaoguanyibachu", typeof(string));//底部数据 需要取得最新
            dt.Columns.Add("shijian1", typeof(string));
            dt.Columns.Add("daiguanzhuanke", typeof(string));
            dt.Columns.Add("shijian2", typeof(string));
            dt.Columns.Add("daiguanchuyuan", typeof(string));
            dt.Columns.Add("shijian3", typeof(string));
            dt.Columns.Add("yufangxiaoguo", typeof(string));//非计划性拔管，无非计划拔管
            dt.Columns.Add("ElectricSignBase64", typeof(string));//电签
        }

        /// <summary>
        /// 统计管道种类分数
        /// </summary>
        /// <param name="scoreString">管道种类分数字符串</param>
        /// <param name="typeScore">管道类型分数：高危3分，中危2分，低危1分</param>
        /// <returns>分数</returns>
        private string getScore(string scoreString, int typeScore)
        {
            int score = 0;
            string GDZL_text = scoreString;
            string[] GdArray = GDZL_text.Split('/');
            for (int i = 0; i < GdArray.Length; i++)
            {
                if (!string.IsNullOrEmpty(GdArray[i]))
                {
                    score += Convert.ToInt32(GdArray[i]);
                }
            }
            score = score * typeScore;
            string result = score == 0 ? "" : score + "";
            return result;
        }
        #endregion

        #region 窗体加载启动锐浪报表
        private void ExtubationRisPrint_Load(object sender, EventArgs e)
        {
            axGRPrintViewer1.Start();
        }
        #endregion
    }
}